package com.bestcem.xm.txtanls.dao;

import com.bestcem.xm.txtanls.dao.dto.PageDTO;
import com.bestcem.xm.txtanls.entity.pojo.ProjectDO;
import com.bestcem.xm.txtanls.entity.pojo.ProjectFieldDO;
import com.bestcem.xm.txtanls.enums.TrainStatusEnum;
import com.bestcem.xm.txtanls.grpc.service.param.PageParam;

import java.util.List;

/**
 * mongo TXTANLS_ANLSPROJECT 相关DAO层方法
 *
 * @author XiaoYunSong <ys.xiao@idiaoyan.com>
 * @version v1.0
 * @date 2021/5/10
 */
public interface AnalysisProjectDao {

    /**
     * 获取文本分析项目
     *
     * @param projectId 项目id
     * @return The analysis project
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    ProjectDO findById(String projectId);

    /**
     * 根据状态获取第一个满足的文本分析项目
     *
     * @param status 项目状态
     * @return The analysis project
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    ProjectDO findOneByStatus(int status);

    /**
     * 根据状态获取所有满足的文本分析项目
     *
     * @param status 项目状态
     * @return The analysis project
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/7/8 14:02
     */
    List<ProjectDO> findAllByStatus(int status);

    /**
     * 根据项目名称和创建用户查询文本分析项目
     *
     * @param projectName 项目名字
     * @param userId      用户id
     * @return The analysis project
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    ProjectDO findByNameAndCreator(String projectName, String userId);

    /**
     * 获取用户创建的所有文本分析项目
     * 分页
     *
     * @param userId    用户id
     * @param pageParam 分页参数
     * @return All analysis projects created by the user with specify page size
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    PageDTO<ProjectDO> findUserAllProject(String userId, PageParam pageParam, String name, Integer status);

    /**
     * 获取属于对应组织的所有文本分析项目
     * 分页
     *
     * @param orgId     组织id
     * @param pageParam 分页参数
     * @return All analysis projects belonging the organization with specify page size
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    PageDTO<ProjectDO> findOrganizationAllProject(String orgId, PageParam pageParam, String name, Integer status);

    /**
     * 获取所有使用了对应文本字段的文本分析项目
     *
     * @param textFieldId 文本字段id
     * @return All analysis projects that use the text field
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/7/15 18:00
     */
    List<ProjectDO> findAllProjectByFieldId(String textFieldId);

    /**
     * 获取问卷分析项目
     *
     * @param surveyId 问卷id
     * @return Survey analysis project
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    ProjectDO findSurveyAnalysisProject(String surveyId);

    /**
     * 插入文本分析项目
     *
     * @param initEntity 文本分析项目初始属性
     * @return Created analysis project
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    ProjectDO insertProject(ProjectDO initEntity);

    /**
     * 更新文本分析项目
     * 传参需满足配置的 Validation 规则, 否则触发快速失败
     *
     * @param projectDO 文本分析项目更新属性
     * @return The result of an update operation
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    int updateProject(ProjectDO projectDO);

    /**
     * 更新文本分析项目状态
     *
     * @param projectId 项目id
     * @param status    目标状态
     * @return The result of an update operation
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    int updateAnalysisProjectStatus(String projectId, int status);

    /**
     * 更新训练进度和训练状态到项目表
     *
     * @return UpdateResult
     * @author gy.liu
     * @date 2021/5/27
     */
    int updateAnalysisProjectProgress(String projectId, TrainStatusEnum status, long trainProgress);

    /**
     * 更新文本分析项目训练字段列表
     *
     * @param projectId  项目id
     * @param textFields 更新后的训练字段列表
     * @return The result of an update operation
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/14 16:23
     */
    int updateProjectFieldList(String projectId, List<ProjectFieldDO> textFields);

    /**
     * 更新文本分析项目时间字段信息
     *
     * @param projectId     项目id
     * @param timeFieldId   时间字段id
     * @param timeFieldName 时间字段名
     * @return The result of an update operation
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/17 10:49
     */
    int updateProjectTimeField(String projectId, String timeFieldId, String timeFieldName);

    /**
     * 更新所有使用对应数据源的文本分析项目的数据表名称
     *
     * @param tableId   数据表id
     * @param tableName 数据表名称
     * @return The result of an update operation
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/7/15 17:23
     */
    int updateTableNameByTableId(String tableId, String tableName);

    /**
     * 更新所有使用了对应时间字段的文本分析项目的时间字段名称
     *
     * @param timeFieldId   时间字段id
     * @param timeFieldName 时间字段名称
     * @return The result of an update operation
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/7/15 17:37
     */
    int updateTimeFieldByTimeId(String timeFieldId, String timeFieldName);

    /**
     * 删除文本分析项目
     *
     * @param projectId 项目id
     * @return The result of a delete operation
     * @author XiaoYunSong <ys.xiao@idiaoyan.cn>
     * @date 2021/5/12 18:07
     */
    int deleteProject(String projectId);

    /**
     * 查询项目文本字段id
     *
     * @param projectId 文本分析项目id
     * @return 分析字段id list
     * @date 2021/5/13 19:46
     * @author liheng
     */
    List<String> listTextFiledId(String projectId, String fieldId);

    List<ProjectDO> findAllProjectByOrgId(String orgId, boolean surveyIdNullFlag);

    /**
     * 更新项目字段下的偏移量
     *
     * @param projectId 项目id
     * @param fieldId   字段id
     * @param offset    偏移量
     * @return UpdateResult
     * @author jy.zhao
     * @date 2022/2/21 11:22
     **/
    void updateProjectFieldOffset(String projectId, String fieldId, int offset);

    Long updateSampleModelId(String defaultModelId);

    List<String> listGroupOrgId();

    Long updateSetModelId(String orgId, String trainModelId);
}
